home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
language
/
parallax
/
more_exa.tar
/
more
/
fft.p
next >
Wrap
Text File
|
1991-11-26
|
7KB
|
264 lines
SYSTEM fastfouriertrans;
(* ======================================================= *)
(* Program for parallel Fast-Fourier transformation *)
(* ======================================================= *)
CONST n = 4; (* number of inputvalues (power of 2) *)
TYPE komplex = RECORD
r : REAL; (* real part *)
i : REAL; (* imaginary part *)
END;
vek1 = ARRAY [0..n-1] OF komplex;
(* ------------------------------------------------------- *)
(* connection of single processing elements *)
(* the connection structure is a two-dimensioned array *)
(* (like a grid with connections in all four directions) *)
(* ------------------------------------------------------- *)
CONFIGURATION liste [n];
CONNECTION left: liste[i] -> liste[i-1].right;
right: liste[i] -> liste[i+1].left;
(* ------------------------------------------------------- *)
(* variables : (for main-program) *)
(* ------------------------------------------------------- *)
SCALAR j, k, logn, h, p, q : INTEGER;
a, b : vek1;
tmp2 : komplex;
VECTOR c, c_plus_p, z,
tmp1, tmp5,
tmp6, tmp7 : komplex;
tmp3 : INTEGER;
(* ------------------------------------------------------- *)
(* The procedure multplex computes the multiplication of *)
(* two complex numbers *)
(* ------------------------------------------------------- *)
PROCEDURE multkomplex(VECTOR a,b : komplex;VECTOR VAR c : komplex);
BEGIN
c.r := (a.r * b.r) - (a.i * b.i);
c.i := (a.r * b.i) - (a.i * b.r);
END multkomplex;
(* ------------------------------------------------------- *)
(* The procedure addkomplex computes the sumary of two *)
(* complex numbers *)
(* ------------------------------------------------------- *)
PROCEDURE addkomplex(VECTOR a,b : komplex;VECTOR VAR c : komplex);
BEGIN
c.r := (a.r + b.r);
c.i := (a.i + b.i);
END addkomplex;
(* ------------------------------------------------------- *)
(* The procedure subkomplex computes the subtraction of two*)
(* complex numbers *)
(* ------------------------------------------------------- *)
PROCEDURE subkomplex(VECTOR a,b : komplex;VECTOR VAR c : komplex);
BEGIN
c.r := (a.r - b.r);
c.i := (a.i - b.i);
END subkomplex;
(* ------------------------------------------------------- *)
(* The procedure multkomplexspez computes the power of a *)
(* whole number with a complex number *)
(* ------------------------------------------------------- *)
PROCEDURE multkomplexspez(VECTOR a: komplex; VECTOR b: INTEGER;
VECTOR VAR c : komplex);
VECTOR i : INTEGER;
tmp : komplex;
BEGIN
IF b = 0 THEN
c.r := 1.0;
c.i := 0.0;
ELSE
tmp := a;
FOR i := 2 TO b DO
multkomplex(a,tmp,a);
END;
c := a;
END;
END multkomplexspez;
(* ------------------------------------------------------- *)
(* The procedure w_power computes the n-th unionradix w *)
(* with w = e^((2*PI)/n) *)
(* ------------------------------------------------------- *)
PROCEDURE w_hoch (SCALAR p : INTEGER; SCALAR VAR x : komplex);
SCALAR tmp : REAL;
BEGIN
tmp := (2.0 * PI * FLOAT(p))/FLOAT(n);
x.r := Cos(tmp);
x.i := Sin(tmp);
END w_hoch;
(* ------------------------------------------------------- *)
(* The procedure Reverse transforms a number : *)
(* the transfering number would be decomposed in its *)
(* binary representation, turned back and transfering *)
(* back as decimal number. *)
(* Important: representation in log(n)-Bit *)
(* ------------------------------------------------------- *)
PROCEDURE reverse (SCALAR k : INTEGER; SCALAR VAR erg : INTEGER);
SCALAR tmp3 : REAL;
tmp1,tmp2 : INTEGER;
BEGIN
tmp1 := 0;
tmp3 := 0.0;
WHILE tmp1 <> (logn) DO
tmp2 := k DIV 2**(logn-1-tmp1);
IF tmp2 = 1 THEN
tmp3 := tmp3 + FLOAT(2**(tmp1));
k := k - 2**(logn-1-tmp1);
END;
tmp1 := tmp1 + 1;
END;
erg := TRUNC(tmp3);
END reverse;
PROCEDURE reverse2 (VECTOR k : INTEGER; VECTOR VAR erg : INTEGER);
VECTOR tmp3 : REAL;
tmp1,tmp2 : INTEGER;
BEGIN
tmp1 := 0;
tmp3 := 0.0;
WHILE tmp1 <> (logn) DO
tmp2 := k DIV 2**(logn-1-tmp1);
IF tmp2 = 1 THEN
tmp3 := tmp3 + FLOAT(2**(tmp1));
k := k - 2**(logn-1-tmp1);
END;
tmp1 := tmp1 + 1;
END;
erg := TRUNC(tmp3);
END reverse2;
(* ------------------------------------------------------- *)
(* The procedure Input read input vector a *)
(* ------------------------------------------------------- *)
PROCEDURE Input (SCALAR VAR a : vek1);
SCALAR i : INTEGER;
BEGIN
WriteString(' Enter Input-Vector a :');
WriteLn;
FOR i := 0 TO n-1 DO
WriteString(' a['); WriteInt(i,1);
WriteString('] : ');
ReadReal(a[i].r);
a[i].i := 0.0;
END;
WriteLn;
END Input;
(* ------------------------------------------------------- *)
(* The procedure output displays solution-vector b *)
(* ------------------------------------------------------- *)
PROCEDURE output (SCALAR b : vek1);
SCALAR i,i2 : INTEGER;
BEGIN
WriteString(' Solution : ');
FOR i := 0 TO n-1 DO
reverse(i,i2);
WriteLn;
WriteFixPt(b[i2].r,7,2);
WriteFixPt(b[i2].i,7,2);
END;
WriteLn;
END output;
(* ------------------------------------------------------- *)
(* start of main-program *)
(* ------------------------------------------------------- *)
BEGIN
Input(a);
LOAD (c,a);
logn := TRUNC (Ln(FLOAT(n))/Ln(2.0));
FOR h := logn-1 TO 0 BY -1 DO
p := 2**h;
q := TRUNC(FLOAT(n)/FLOAT(p));
PARALLEL
w_hoch(p,tmp2);
z := tmp2;
tmp1 := c;
reverse2 (DIM1,tmp3);
multkomplexspez (z,(tmp3 MOD q),tmp5);
c_plus_p.r := c.r;
c_plus_p.i := c.i;
tmp7.r := 0.0;
tmp7.i := 0.0;
PROPAGATE.left^p(c_plus_p.r);
PROPAGATE.left^p(c_plus_p.i);
IF (DIM1 MOD p) = (DIM1 MOD (2*p)) THEN
multkomplex(c_plus_p,tmp5,tmp6);
addkomplex (tmp1,tmp6,c);
subkomplex (tmp1,tmp6,tmp7);
END;
PROPAGATE.right^p(tmp7.r,c_plus_p.r);
PROPAGATE.right^p(tmp7.i,c_plus_p.i);
IF (DIM1 MOD p) <> (DIM1 MOD (2*p)) THEN
c := c_plus_p;
END;
ENDPARALLEL;
END;
STORE (c,b);
output (b);
END fastfouriertrans.